#pragma once
#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"
#include "spdlog/sinks/stdout_color_sinks.h"

// 对spdlog进行二次封装
// 需求：1. 宏定义全局日志对象
//      2. 支持日志输出时有文件和行号
//      3. 支持调试模式下输出日志到控制台，发布模式下输出日志到文件
//      4. 支持日志级别的过滤

// 程序模式 mode: debug:1  release:0
namespace im{
    std::shared_ptr<spdlog::logger> g_default_logger;
    void initLogger(bool mode, const std::string& logPath ="", int32_t logLevel = spdlog::level::trace){
        if(mode == true){
            // 调试模式下，全部日志等级都输出到控制台
            g_default_logger = spdlog::stdout_color_mt("default-logger");
        }else{
            // 发布模式下，日志等级过滤，输出到文件
            g_default_logger = spdlog::basic_logger_mt("default-logger", logPath);
        }
        g_default_logger->flush_on(static_cast<spdlog::level::level_enum>(logLevel));
        g_default_logger->set_level(static_cast<spdlog::level::level_enum>(logLevel));
        g_default_logger->set_pattern("[%Y-%m-%d %H:%M:%S] [%^%l%$] [thread %t] %v");    
    }

    #define LOG_TRACE(format, ...) g_default_logger->trace(std::string("[{}:{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)
    #define LOG_INFO(format, ...) g_default_logger->info(std::string("[{}:{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)
    #define LOG_DEBUG(format, ...) g_default_logger->debug(std::string("[{}:{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)
    #define LOG_WARN(format, ...) g_default_logger->warn(std::string("[{}:{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)
    #define LOG_CRITICAL(format, ...) g_default_logger->critical(std::string("[{}:{}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)
}